今天要來解的題目是阿姆斯壯數,阿姆斯壯數是什麼呢?假定給定一個 n 位數的整數,該整數的每個位數乘上 n 次方的總和剛好為該整數,則該數字就為阿姆斯壯數。
ex:
1634 = 1^4 + 6^4 + 3^4+ 4^4
這次的題目就是要輸入兩個數,n, m(n < m 且 n > 0),並且找出給定的 n~m 範圍內的所有阿姆斯壯數。
理解題目後我們就來實作吧!
function armstrongNum(low, high) {
  let nums = []; // 記錄阿姆斯壯數
  for (let i = low; i <= high; i++) {
    // 計算i幾位數,並將每個位數存起來
    let numLength = 0; // 記錄i是幾位數
    let digits = []; // 記錄i每個位數的數字
    let tempNum = i; // 將i記錄起來,等下要用它不斷除10取出每個位數的數字
    let sum = 0; // 每個位數的 numLength 次方之總和,最後會和i比較是否相同
  }
  return nums;
}
function armstrongNum(low, high) {
  let nums = [];
  for (let i = low; i <= high; i++) {
    // 計算i幾位數,並將每個位數存起來
    let numLength = 0; // 記錄i是幾位數
    let digits = []; // 記錄i每個位數的數字
    let tempNum = i; // 將i記錄起來,等下要用它不斷除10取出每個位數的數字
    let sum = 0; // 每個位數的 numLength 次方之總和,最後會和i比較是否相同
    while (tempNum > 0) {
      let digit = Math.floor(tempNum % 10);
      digits.push(digit);
      tempNum = Math.floor(tempNum / 10);
      numLength++;
    }
  }
  return nums;
}
接著要將每個位數取出來乘上 numLength 次 (numLength記錄 i 是幾位數),因此建立雙層 for 迴圈,外層負責取出每個位數的數字,內層負責乘法的動作,最後得出一個總和。如果這個總合和 i 的值(當前判斷是否為阿姆斯壯數的數字)一樣,就可以斷定此 i 是阿姆斯壯數。
之後將 i 推入 nums 陣列(阿姆斯壯數),
function armstrongNum(low, high) {
  let nums = [];
  for (let i = low; i <= high; i++) {
    // 計算i幾位數,並將每個位數存起來
    let numLength = 0; // 記錄i是幾位數
    let digits = []; // 記錄i每個位數的數字
    let tempNum = i; // 將i記錄起來,等下要用它不斷除10取出每個位數的數字
    let sum = 0; // 每個位數的 numLength 次方之總和,最後會和i比較是否相同
    while (tempNum > 0) {
      let digit = Math.floor(tempNum % 10);
      digits.push(digit);
      tempNum = Math.floor(tempNum / 10);
      numLength++;
    }
    // 將各個位數取出乘numLength次
    for (let j = 0; j < numLength; j++) {
      let digit = digits[j];
      let tempDigit = digits[j];
      for (let k = 1; k < numLength; k++) { // 這裡k要從1開始
        digit *= tempDigit;
      }
      sum += digit;
    }
    if (sum == i) {
      nums.push(i);
    }
  }
  return nums;
}
透過這行程式運行的結果如下:
console.log(armstrongNum(1, 1000));

這次的程式碼在以下連結:
https://github.com/a90100/javascript-data-structure/blob/master/day26-armstrong-number.js
明天我們將來實作"凱撒密碼"的問題!